Fix signed integer overflow with midpoint interpolation#107
Open
miikkas wants to merge 1 commit intorust-ndarray:masterfrom
Open
Fix signed integer overflow with midpoint interpolation#107miikkas wants to merge 1 commit intorust-ndarray:masterfrom
miikkas wants to merge 1 commit intorust-ndarray:masterfrom
Conversation
The simple algorithm is replaced with an Euclid division and remainder based slightly more complex one when the inputs are integers. Moreover, the implementation is separated for integers and floating point numbers, relying on macros instead of generics with trait bounds. A regression test that failed before the changes is added along with property-based testing ensuring that the results match those that the previous version output (when within the non-overflowing limits).
15307eb to
1aaa960
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
I found this while exploring whether QuickCheck could be updated. Its newer version seems to run more thorough testing, which revealed this problem among others.
Assembly comparison
The new algorithm is not really much more complex than the original when comparing the assembly.
I checked the Compiler Explorer results for the following simplified versions, using
-C opt-level=1for compiler option:The old algorithm produces the following assembly:
The new algorithm produces the following:
So it seems the new algorithm is two instructions longer.
I ran additional testing locally with the following command to ensure the changed algorithm returns the exact same results as the previous one:
Something I'm a bit unsure about is whether there are any additional types
Midpointshould be implemented for.